package de.fhffm.gaertnerei.gui;
/**
 * @author Kerim Septa & Julian Schmücker
 */

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.regex.Pattern;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import de.fhffm.gaertnerei.exceptions.EingabeException;

@SuppressWarnings("serial")
public class DuengerBearbeitenFenster extends JFrame implements ActionListener{
	
	private JButton buttonSpeichern = new JButton("Speichern");
	private JButton buttonAbbrechen = new JButton("Abbrechen");
	
	private JLabel labelUeberschrift = new JLabel("Dünger bearbeiten");
	private JLabel labelMarke = new JLabel("Marke");
	private JLabel labelStickstoff = new JLabel("Stickstoff");
	private JLabel labelPhosphat = new JLabel("Phosphat");
	private JLabel labelKalium = new JLabel("Kalium");
	private JLabel labelMagnesium = new JLabel("Magnesium");
	private JLabel labelProzentStickstoff = new JLabel("%");
	private JLabel labelProzentPhosphat = new JLabel("%");
	private JLabel labelProzentKalium = new JLabel("%");
	private JLabel labelProzentMagnesium = new JLabel("%");
	
	private JTextField textfeldMarke = new JTextField(8);
	private JTextField textfeldStickstoff = new JTextField(8);
	private JTextField textfeldPhosphat = new JTextField(8);
	private JTextField textfeldKalium = new JTextField(8);
	private JTextField textfeldMagnesium = new JTextField(8);
	
	private JPanel panelEingabe = new JPanel(new GridLayout(5,2));
	private JPanel panelButton = new JPanel();
	private JPanel panelUeberschrift = new JPanel();
	
	private String marke = null;
	private String stickstoffString = null;
	private String phosphatString = null;
	private String kaliumString = null;
	private String magnesiumString = null;
	
	private int stickstoffInt = 0;
	private int phosphatInt = 0;
	private int kaliumInt = 0;
	private int magnesiumInt = 0;
	
	private List<String> ausgewaehlteZeile;
	
	StringBuilder stringBuilder = new StringBuilder();
	
	public DuengerBearbeitenFenster(List<String>ausgewaehlteZeile){
		
		this.ausgewaehlteZeile = ausgewaehlteZeile;
		
		setzeToolTips();
		bestandteileAnordnen();
		ereignissensorenAnmeldung();
		erstelleFenster();	
		fuelleTextfelder();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		Object obj = e.getSource();
		
		if(obj == buttonAbbrechen){
			dispose();
		}
		
		if(obj == buttonSpeichern){
			
			if(ueberpruefeEingabe()){
				
				speicherAenderungen();
				speichernEnde();
				
			}else{
				
				System.out.println("Eingabe Fehler");
			}
		}
	}

	private void setzeToolTips() {
		
		textfeldStickstoff.setToolTipText("Menge des im Dünger enthaltenen Stickstoffs in %");
		textfeldPhosphat.setToolTipText("Menge des im Dünger enthaltenen Phosphats in %");
		textfeldKalium.setToolTipText("Menge des im Dünger enthaltenen Kaliums in %");
		textfeldMagnesium.setToolTipText("Menge des im Dünger enthaltenen Magnesiums in %");		
	}
	
	private void erstelleFenster() {
	
		setTitle("Dünger bearbeiten");
		setSize(400,500);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		pack();
		setVisible(true);
		setResizable(false);
		
	}

	private void fuelleTextfelder() {
		
		String[] teilString;
		textfeldMarke.setText(ausgewaehlteZeile.get(0));
		teilString = ausgewaehlteZeile.get(1).split(Pattern.quote(" ")); // % entfernen
		textfeldKalium.setText(teilString[0]);
		teilString = ausgewaehlteZeile.get(2).split(Pattern.quote(" "));
		textfeldMagnesium.setText(teilString[0]);
		teilString = ausgewaehlteZeile.get(3).split(Pattern.quote(" "));
		textfeldPhosphat.setText(teilString[0]);
		teilString = ausgewaehlteZeile.get(4).split(Pattern.quote(" "));
		textfeldStickstoff.setText(teilString[0]);
	}
	
	private void ereignissensorenAnmeldung(){
		
		buttonSpeichern.addActionListener(this);
		buttonAbbrechen.addActionListener(this);
	}
	
	private void bestandteileAnordnen(){
		
		GroupLayout neuePflanzeFensterLayout = new GroupLayout(getContentPane());
		getContentPane().setLayout(neuePflanzeFensterLayout);
		
		neuePflanzeFensterLayout.setAutoCreateGaps(true);
		neuePflanzeFensterLayout.setAutoCreateContainerGaps(true);
		
		neuePflanzeFensterLayout.setVerticalGroup(neuePflanzeFensterLayout.createSequentialGroup().
				addComponent(panelUeberschrift).
				addComponent(panelEingabe).
				addComponent(panelButton));
		
		neuePflanzeFensterLayout.setHorizontalGroup(neuePflanzeFensterLayout.createParallelGroup().
				addComponent(panelUeberschrift).
				addComponent(panelEingabe).
				addComponent(panelButton));		
	
		panelUeberschriftAnordnen();
		panelEingabeAnordnen();
		panelButtonAnordnen();
	}

	private void panelUeberschriftAnordnen(){
		
		panelUeberschrift.setLayout(new FlowLayout());
		panelUeberschrift.add(labelUeberschrift);
		labelUeberschrift.setFont(new Font("Times new Roman", Font.BOLD, 22));
	}
	
	private void panelEingabeAnordnen(){
		
		GroupLayout eingabePanelLayout = new GroupLayout(panelEingabe);
		panelEingabe.setLayout(eingabePanelLayout);
		
		eingabePanelLayout.setAutoCreateGaps(true);
		eingabePanelLayout.setAutoCreateContainerGaps(true);
		
		eingabePanelLayout.setVerticalGroup(eingabePanelLayout.createSequentialGroup( ).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						addComponent( labelMarke ).
						addComponent( textfeldMarke )
					).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
					  	addComponent( labelStickstoff ).
						addComponent( textfeldStickstoff ).
						addComponent(labelProzentStickstoff)
					).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						  	addComponent( labelPhosphat ).
							addComponent( textfeldPhosphat ).
							addComponent(labelProzentPhosphat)
					).
			  		addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
			  			addComponent( labelKalium ).
			  			addComponent( textfeldKalium ).
			  			addComponent(labelProzentKalium)
					).
			  		addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						addComponent( labelMagnesium ).
					  	addComponent( textfeldMagnesium ).
					  	addComponent(labelProzentMagnesium)));
						
		eingabePanelLayout.setHorizontalGroup(eingabePanelLayout.createParallelGroup( ).addGroup(eingabePanelLayout.createSequentialGroup( ).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( labelMarke, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelStickstoff,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelPhosphat,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelKalium, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelMagnesium,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE )
					).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( textfeldMarke, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldStickstoff,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldPhosphat,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldKalium, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( textfeldMagnesium,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE )
					).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
							addComponent( labelProzentStickstoff, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
							addComponent( labelProzentPhosphat,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
							addComponent( labelProzentKalium,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
							addComponent( labelProzentMagnesium,GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE ))));
	}
	
	private void panelButtonAnordnen(){
		
		panelButton.setLayout(new FlowLayout());
		panelButton.add(buttonSpeichern);
		panelButton.add(buttonAbbrechen);
	}
	
	private boolean ueberpruefeEingabe() {
		
		boolean pruefe = false;
		try {
			pruefe = hohleEingabe();
		} catch (EingabeException e) {
			System.out.println("Eingabe Fehlt");
		} catch (NumberFormatException n){
			System.out.println("Bitte Zahlen eingeben!");
			JOptionPane.showMessageDialog(null,"Bitte für Phosphat, Magnesium, Kalium oder Stickstoff nur Zahlen eingeben.","Fehler",JOptionPane.ERROR_MESSAGE);
		}
		return pruefe;
	}
	
	private boolean hohleEingabe() throws EingabeException,NumberFormatException {
		
		marke = textfeldMarke.getText();
		stickstoffInt = Integer.parseInt(textfeldStickstoff.getText());
		stringBuilder.append(stickstoffInt).append(" %"); // % wird drangehängt
		stickstoffString = stringBuilder.toString();
		stringBuilder.setLength(0);
		phosphatInt = Integer.parseInt(textfeldPhosphat.getText());
		stringBuilder.append(phosphatInt).append(" %");
		phosphatString = stringBuilder.toString();
		stringBuilder.setLength(0);
		kaliumInt = Integer.parseInt(textfeldKalium.getText());
		stringBuilder.append(kaliumInt).append(" %");
		kaliumString = stringBuilder.toString();
		stringBuilder.setLength(0);
		magnesiumInt = Integer.parseInt(textfeldMagnesium.getText());
		stringBuilder.append(magnesiumInt).append(" %");
		magnesiumString = stringBuilder.toString();
		stringBuilder.setLength(0);
		
		if(isEingabeLeer()){
			
			throw new EingabeException("Eine oder mehrere Eingaben fehlen, bitte keine negativen Zahlen eingeben!");
		
		}else{
			
			return true;

		}
	}
		
	private boolean isEingabeLeer() {
			// Ein Düner kann auch mal kein Stickstoff,phosphat usw. haben deswegen <= -1
			
			if(marke.length() == 0 || stickstoffInt <= -1 || phosphatInt <= -1 || kaliumInt <= -1 || magnesiumInt <= -1){
			
				return true;
			
			}else{
			
				return false;
			}
		}
	
	private void speicherAenderungen() {
		
		String originalMarke = ausgewaehlteZeile.get(0);
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("chilidatenbank");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("UPDATE Duenger d SET d.duengerMarke =:marke, d.kalium =:kalium, d.magnesium =:magnesium, d.phosphat =:phosphat, d.stickstoff =:stickstoff WHERE d.duengerMarke =:orgMarke");
				  q.setParameter("marke", marke);
				  q.setParameter("kalium", kaliumString);
				  q.setParameter("magnesium", magnesiumString);
				  q.setParameter("phosphat", phosphatString);
				  q.setParameter("stickstoff", stickstoffString);
				  q.setParameter("orgMarke", originalMarke);	  
				  q.executeUpdate();
		em.getTransaction().commit();
		em.close();
	}
	
	private void speichernEnde() {
		
		Object[] options = {"Fertig!","Weiter bearbeiten"};
		int selected = JOptionPane.showOptionDialog(null,"Dünger erfolgreich bearbeitet!", "Änderungen gespeichert", JOptionPane.YES_NO_OPTION,
					   JOptionPane.QUESTION_MESSAGE, null , options ,options[1]);
		
		switch(selected){
		
		case 0:
			dispose();
			break;
		case 1:
			dispose();
			new BearbeitenTabellenFenster(2);
			break;
		}
	}

}
